Bson 与 JSON 的序列化与反序列化

您所在的位置:网站首页 python json序列化和反序列化 Bson 与 JSON 的序列化与反序列化

Bson 与 JSON 的序列化与反序列化

#Bson 与 JSON 的序列化与反序列化| 来源: 网络整理| 查看: 265

Bson 与 JSON 的序列化与反序列化

参考文章:

http://blog.csdn.net/z69183787/article/details/26709505https://blog.csdn.net/dai815904261/article/details/78919414https://www.cnblogs.com/fengxuehuanlin/p/5700282.htmlhttps://www.cnblogs.com/yanweidie/p/4605212.html

一, Bson 和 JSON 的区别

BSON 是由 10gen 开发的一个数据格式, 是一种基于 JSON 的二进制序列化格式, 用于 MongoDB 存储文档并进行远程过程调用. BSON 基于 JSON 格式, 选择 JSON 进行改造的原因主要是 JSON 的通用性及 JSON 的 schemaless 的特性.

BSON 主要会实现以下三点目标:

(1) 更快的遍历速度

对 JSON 格式来说, 太大的 JSON 结构会导致数据遍历非常慢. 在 JSON 中, 要跳过一个文档进行数据读取, 需要对此文档进行扫描才行, 需要进行麻烦的数据结构匹配, 比如括号的匹配, 而 BSON 对 JSON 的一大改进就是, 它会将 JSON 的每一个元素的长度存在元素的头部, 这样你只需要读取到元素长度就能直接 seek 到指定的点上进行读取了.

(2) 操作更简易

对 JSON 来说, 数据存储是无类型的, 比如你要修改基本一个值, 从 9 到 10, 由于从一个字符变成了两个, 所以可能其后面的所有内容都需要往后移一位才可以. 而使用 BSON, 你可以指定这个列为数字列, 那么无论数字从 9 长到 10 还是 100, 我们都只是在存储数字的那一位上进行修改, 不会导致数据总长变大. 当然, 在 MongoDB 中, 如果数字从整形增大到长整型, 还是会导致数据总长变大的.

(3) 增加了额外的数据类型

JSON 是一个很方便的数据交换格式, 但是其类型比较有限. BSON 在其基础上增加了 "byte array" 数据类型. 这使得二进制的存储不再需要先 base64 转换后再存成 JSON. 大大减少了计算开销和数据大小.

但是, 在有的时候, BSON 相对 JSON 来说也并没有空间上的优势, 比如对 {"field":7}, 在 JSON 的存储上 7 只使用了一个字节, 而如果用 BSON, 那就是至少 4 个字节 (32 位)

目前在 10gen 的努力下, BSON 已经有了针对多种语言的编码解码包. 并且都是 Apache 2 license 下开源的. 并且还在随着 MongoDB 进一步地发展.

BSON 支持的数据类型如表所示.

BSON 支持的数据类型类型 描述示例NULL表示空值或者不存在的字段,{"x" : null}Boolean布尔型有 true 和 false,{"x" : true}Number数值:客户端默认使用 64 位浮点型数值。{"x" : 3.14} 或 & nbsp;{"x" : 3}。对于整型值,包括 NumberInt(4 字节符号整数)或 NumberLong(8 字节符号整数),用户可以指定数值类型,{"x" : NumberInt("3")}String字符串:BSON 字符串是 UTF-8,{"x" : "中文"}Regular Expression正则表达式:语法与 & nbsp;JavaScript http://c.biancheng.net/js/

  的正则表达式相同,{"x" : /[cba]/}

Array数组:使用 “[]” 表示,{"x" : ["a", "b", "c"]}Object内嵌文档:文档的值是嵌套文档,{"a" : {"b" : 3}}ObjectId对象 id:对象 id 是一个 12 字节的字符串,是文档的唯一标识,{"x" : objectId()}BinaryData二进制数据:二进制数据是一个任意字节的字符串。它不能直接在 & nbsp;Shell http://c.biancheng.net/shell/

  中使用。如果要将非 UTF-8 字符保存到数据库中,二进制数据是唯一的方式

Java http://c.biancheng.net/java/

Script

代码:查询和文档中可以包括任何 JavaScript 代码,{"x" : function(){/*...*/}}Data日期:{"x" : new Date()}Timestamp时间戳:var a = new Timestamp()

二, JSON 的序列化和反序列化

1. 使用 JavaScriptSerializer 类:

// 使用 JavaScriptSerializer 方式需要引入的命名空间, 这个在程序集 System.web.Extensions.dll. 中using System.Web.Script.Serialization;

2. 使用 DataContractJsonSerializer 类:

// 实体中的特性 [DataMember],[DataContract], 是使用 DataContractJsonSerializer 序列化和反序列化必须要加的// 使用 DataContractJsonSerializer 方式需要引入的命名空间, 在 System.Runtime.Serialization.dll. 中using System.Runtime.Serialization.JSON;

3.(推荐) 使用 JSON.NET(即 Newtonsoft.JSON) 类库:

using Newtonsoft.JSON;

反序列化: JsonConvert.DeserializeObject()

序列化: JsonConvert.SerializeObject()

JSON.NET 是支持序列化和反序列化 DataTable,DataSet,Entity Framework 和 Entity 的. 序列化和反序列化常用到 JsonSerializerSettings 类进行设置

class Program { static void Main(string[] args) { // 序列化操作 var JSON = new { user = new { name = "fxhl", age = 23 }}; string jsonData = JsonConvert.SerializeObject(JSON); Console.WriteLine(jsonData); // 反序列化操作方法一 Person p1= JsonConvert.DeserializeObject(jsonData); Console.WriteLine(p1.user.name); // 反序列化操作方法二 string json2 = "[{\"user\":{\"name\":\"fxhl\",\"age\":23}}]"; List listp2= JsonConvert.DeserializeObject(json2); Console.WriteLine(listp2[0].user.name); Console.ReadKey(); } } public class Person { public Person user { get; set; } public string name { get; set; } public int age { get; set; } }

三, Bson 的序列化与反序列化

反序列化: BsonSerializer.Deserialize()

序列化: BsonExtensionMethods.ToJson()

四, 高级用法

请点原文链接查看 Newtonsoft.JSON 高级用法 https://www.cnblogs.com/yanweidie/p/4605212.html

1. 使用特性实现特殊化处理

序列化和反序列化对象时, 可以通过在字段和类上添加特性, 实现特殊化处理

1.1 类特性

[BsonIgnoreExtraElements]:BsonSerializer 时, 忽略未匹配到 i 的字段, 可避免在反序列化时会因为缺少_id 字段而无法成功反序列化对象.

[JsonObject(MemberSerialization.OptIn)]

OptOut 默认值, 类中所有公有成员会被序列化, 如果不想被序列化, 可以用特性 JsonIgnoreOptIn 默认情况下, 所有的成员不会被序列化, 类中的成员只有标有特性 JsonProperty 的才会被序列化, 当类的成员很多, 但客户端仅仅需要一部分数据时, 很有用

1.2 字段特性

可以设置字段是否被忽略, 默认值, null 值处理和类型等等处理. 下面仅列出一些常用特性:

,[Newtonsoft.JSON.JsonIgnore] 特性: 使用 Newtonsoft.JSON 序列化时字段不会被序列化.

,[System.Web.Script.Serialization.ScriptIgnore] 特性: 使用 JavaScriptSerializer 序列化时字段不会被序列化.

,[System.xml.Serialization.XmlIgnore] 特性: 字段不会被序列化成 xml.

,[BsonIgnore] 特性: BsonSerializer 时, 字段不会被序列化.

,[BsonElement]: 自定义字段关联的名称和特殊处理

,[JsonProperty]: 自定义字段关联的名称和特殊处理

,[BsonRepresentation]

2. 采用 JsonSerialzerSettings 统一设置

JsonSerialzerSettings 是 JsonConvert 方法中的参数, 当所有字段做相同处理时, 可直接配置在 JsonSerialzerSettings 中.

例如, JSON 序列化时, 如果时间类型中的毫秒是 0, 则在序列化时会被省略,

// 设置不忽略时间的毫秒.JsonSerializerSettings settings = new JsonSerializerSettings();IsoDateTimeConverter dateConverter = new IsoDateTimeConverter{ DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.fff'Z'" };settings.Converters.Add(dateConverter);string jsonStr = JsonConvert.SerializeObject(arr, settings);// 反序列化设置 忽略不可匹配的项var jSetting = new JsonSerializerSettings();jSetting.NullValueHandling = NullValueHandling.Ignore;string devicejsonstr = FileHelper.GetContentFromFile(devicePath);device = JsonConvert.DeserializeObject(devicejsonstr, jSetting);

3.JsonWriterSettings 配置

把一个对象用 BsonExtensionMethods.ToJson() 方法得到的不是标准 JSON 格式的字符串, value 是带类型说明的.

例如, ToJson() 方法中 int 类型表示为 "Number(x)", 可以使用如下方法改变 Bson 对象序列化时的输出格式:

var jsonWriterSettings = new JsonWriterSettings { OutputMode = JsonOutputMode.Strict };string bsonStr = bsonObj.ToJson(jsonWriterSettings);

得到的 bsonStr 就是标准 JSON 格式的字符串.

五, 注意事项

1.Bson 可以看作是 JSON 的特异化, 有相同点, 也有很大的区别. 所以再做序列化和反序列化时, 代码里最好一直用同一套, 或者是用 bson 和 JSON 有严格的隔离, 不要用着 bson 序列化, 再用 JSON 反序列化.

2. 推荐使用 Bson 进行序列化和反序列化. 因为如果类中存在 BsonDocument 类型的字段, JSON 会反序列化失败!!

3. 前后端交互时, 由于前端一般用标准 JSON 格式, 所以切记要加上

var jsonWriterSettings = new JsonWriterSettings { OutputMode = JsonOutputMode.Strict };

来源: http://www.bubuko.com/infodetail-3346165.html

与本文相关文章 JSON 序列和反序列 1 六, Delphi10.3 通过 JSON.Serializers 单元对大量数据序列化 python 解析 JSON python开发模块基础:序列化模块json,pickle,shelve JSON 模块学习 JSON 数据转换为字典时报错'json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes' python使用pickle,json等序列化dict 05 - JSON 转成树状结构


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3